/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package EntidadesController;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Yan
 */
public class Notificacao {

    /* idnotificacao serial NOT NULL,
    discente_matriculadisc character varying(9) NOT NULL,
    tipo_notif_tiponotificacao character varying NOT NULL,
    docente_matriculadoc character varying NOT NULL,
    texto character varying(150) NOT NULL, */
    private String discente_matriculadisc = "";
    private String  tipo_notif_tiponotificacao = "";
    private String docente_matriculadoc = "";
    private String texto = "";
    private String turma = "";
    private List<String> lista = null;
    private SQLException erro = new SQLException();
    static Connection conexao = null;
    static Statement estado = null;
    static ResultSet rs;
    private String msgerro;
    private boolean render=false;

    public Notificacao() {
        conexao = new Conexao().Acesso();
    }

    public List<SelectItem> getDocente_matriculadoc() throws SQLException {

        List<SelectItem> items = new ArrayList<SelectItem>();

        estado = conexao.createStatement();
        rs = estado.executeQuery("SELECT * FROM docente");
        while (rs.next() == true) {
            docente_matriculadoc = rs.getString(1);
            items.add(new SelectItem(this, docente_matriculadoc));
        }
        return items;
    }

    public void setDocente_matriculadoc(String docente_matriculadoc) {
        this.docente_matriculadoc = docente_matriculadoc;
    }

    public List<String> getListaDiscente_matriculadisc() throws SQLException {

        List<String> items = new ArrayList<String>();

        estado = conexao.createStatement();
        rs = estado.executeQuery("SELECT * FROM preferencia");
        while (rs.next() == true) {
            discente_matriculadisc = rs.getString(1);
            items.add(discente_matriculadisc);
        }
        return items;
    }

    public void setDiscente_matriculadisc(String discente_matriculadisc) {
        this.discente_matriculadisc = discente_matriculadisc;
    }

    public List<String> getListaTipo_notif_tiponotificacao() throws SQLException {

        List<String> items = new ArrayList<String>();

        estado = conexao.createStatement();
        rs = estado.executeQuery("SELECT * FROM tipo_notif");
        while (rs.next() == true) {
             tipo_notif_tiponotificacao = rs.getString(1);
            items.add( tipo_notif_tiponotificacao);
        }
        return items;
    }

    public String getDiscente_matriculadisc() {
        return discente_matriculadisc;
    }
    
    public boolean isRender() {
        return render;
    }

    public void setRender(boolean render) {
        this.render = render;
    }
    public String getMsgerro() {
        return msgerro;
    }

    public void setMsgerro(String msgerro) {
        this.msgerro = msgerro;
    }

    public String getTipo_notif_tiponotificacao() {
        return  tipo_notif_tiponotificacao;
    }

    public void setTipo_notif_tiponotificacao(String  tipo_notif_tiponotificacao) {
        this. tipo_notif_tiponotificacao =  tipo_notif_tiponotificacao;
    }

    public String getTexto() {
        return texto;
    }

    public void setTexto(String texto) {
        this.texto = texto;
    }

    public List<String> getLista() {
        return lista;
    }

    public void setLista(List<String> lista) {
        this.lista = lista;
    }

    public String getTurma() {
        return this.turma;
    }

    public void setTurma(String turma) {
        this.turma = turma;
    }

    public String inserirTurma() throws SQLException
    {
        String result_inserir = "failure";
        try
        {
            estado = conexao.createStatement();
            Docente docente;

            docente = (Docente) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("docente");

            docente_matriculadoc = docente.getMatriculadoc();
            this.lista = this.geraListaAlunos(this.turma);
            int i;
            int j = this.lista.size();

            for (i = 0; i < j; i++)
            {
                estado.execute("INSERT INTO notificacao(discente_matriculadisc, tipo_notif_tiponotificacao, docente_matriculadoc, texto) VALUES ('"
                        + this.lista.get(i) + "','" +  tipo_notif_tiponotificacao + "','" + docente_matriculadoc + "','" + texto + "')");
                estado.execute("INSERT INTO historico_n(discente_matriculadisc, tipo_notif_tiponotificacao, docente_matriculadoc, texto) VALUES ('"
                        + this.lista.get(i) + "','" + tipo_notif_tiponotificacao + "','" + docente_matriculadoc + "','" + texto + "')");
            }
            estado.close();
            msgerro = "Operação realizada com sucesso!";
            render = true;
            result_inserir = "success";
        } catch (SQLException e) {
            this.erro = e;
            msgerro = erro.getLocalizedMessage();

            if (msgerro.contains("pk_matriculadisc")&&msgerro.contains("unicidade"))
            {msgerro = "Esse número de matrícula ja está cadastrado!";}
            estado.close();
            result_inserir = "failure";
            render = true;
        }
        return result_inserir;
    }

    public String escolheTurma(ValueChangeEvent event) {

        if (event.getNewValue() != event.getOldValue()) {
            this.lista = new ArrayList<String>();
        }

        try {
            this.turma = event.getNewValue().toString();
            return "success";
        } catch (Exception e) {
            return "failure";
        }
    }

    public List<String> geraListaAlunos(String codTurma) throws SQLException {
        ArrayList<String> alunos = new ArrayList<String>();
        try 
        {
            estado = conexao.createStatement();
            //  Obtem da tabela 'Turma_has_discente' todas os alunos matriculados em uma determinada turma;
            rs = estado.executeQuery("SELECT discente_matriculadisc FROM Turma_has_discente "
                    + "WHERE turma_disciplina_coddisciplina = '" + turma + "'");
            while (rs.next() == true) {
                alunos.add(rs.getString(1));
            }
            while (rs.next() == true) {

                // Quinta coluna da tabela: variavel 'discente_matriculadisc';
                alunos.add(rs.getString(1));
            }
            return alunos;

        } catch (SQLException ex) {
            System.out.println("A tabela esta vazia.");
            Logger.getLogger(Curso.class.getName()).log(Level.SEVERE, null, ex);
            estado.close();
            return null;
        }
    }

    public String delete(int a[]) throws SQLException {
        String result_delete = "failure";
        try
        {
            estado = conexao.createStatement();
            int i = 0;
            while (i < a.length) {
                estado.execute("DELETE FROM notificacao WHERE  idnotificacao = '" + a[i] + "'");
                i++;
            }
            estado.close();
            result_delete = "success";
        } catch (SQLException e) {
            this.erro = e;
            estado.close();
            result_delete = "failure";
        }
        return result_delete;
    }

    public String getErro() {
        return erro.getMessage();
    }
    /*public static void main(String[] args) {

    Notificacao n = new Notificacao();
    n.setDocente_matriculadoc("333333333");
    n.setdiscente_matriculadisc("071111680");
    n.set tipo_notif_tiponotificacao("Nota");
    n.setTexto("0,98 - se fu + !!!");
    System.out.println(n.inserir());
    int[] i = {14, 15, 16, 18, 19};
    System.out.println(n.delete(i));
    }*/
}
